package persistencia.repositorio;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.hibernate.ejb.EntityManagerFactoryImpl;
import org.hibernate.ejb.EntityManagerImpl;
import entidade.Proprietario;
import persistencia.unidadepersistencia.UnidadePersistencia;

public class RepositorioProprietario {

	public static RepositorioProprietario instanceRepositorioProprietario;

	private EntityManager em = UnidadePersistencia.getInstanceUnidadePersistencia().getEntityManager();

	private Session secao;

	public static RepositorioProprietario getInstanceRepositorioProprietario(){
		if(instanceRepositorioProprietario == null){
			instanceRepositorioProprietario = new RepositorioProprietario();
		}
		return instanceRepositorioProprietario;
	}

	//Método para obter uma Session
	private Session getSession(){

		if(em.getDelegate() instanceof EntityManagerFactoryImpl){
			EntityManagerImpl emi = (EntityManagerImpl) em.getDelegate();
			secao = emi.getSession();
		}else{
			secao = (Session) em.getDelegate();
		}
		return secao;		
	}

	public void novo(Proprietario novoProprietario){
		em.getTransaction().begin();
		em.persist(novoProprietario);
		em.getTransaction().commit();
	}

	public void remover(Proprietario proprietarioARemover){
		em.getTransaction().begin();
		em.remove(proprietarioARemover);
		em.getTransaction().begin();
	}

	public void atualizar(Proprietario proprietarioAAtualizar){
		em.getTransaction().begin();
		em.merge(proprietarioAAtualizar);
		em.getTransaction().commit();
	}

	public Proprietario buscarId(Integer id){
		em.getTransaction().begin();
		Proprietario p = em.getReference(Proprietario.class, id);
		em.getTransaction().commit();
		return p;
	}

	public List<Proprietario> buscarNome(String nome){
		Criteria cri = getSession().createCriteria(Proprietario.class);
		cri.add(Restrictions.like("nomeProprietario", "%"+nome+"%"));
		List<Proprietario> lista = cri.list();
		return lista;
	}

	public List<Proprietario> buscarCPF(String cpf){
		Criteria cri = getSession().createCriteria(Proprietario.class);
		cri.add(Restrictions.eq("cpfProprietario", cpf));
		List<Proprietario> lista = cri.list();
		return lista;
	}

	public List<Proprietario> listarTodos(){
		CriteriaBuilder builder = em.getCriteriaBuilder();
		CriteriaQuery<Proprietario> criteria = builder.createQuery(Proprietario.class);
		criteria.from(Proprietario.class);
		return em.createQuery(criteria).getResultList();

	}
}